<?php

/**
 * Pes for PHP 5.3+
 *
 * Copyright (c) 2013 phpeskill.com (http://www.pescms.com)
 *
 * For the full copyright and license information, please view
 * the file LICENSE.md that was distributed with this source code.
 */

namespace App;

use \Core\Controller\Controller as Controller;
use \Core\Abnormal\Abnormal as Abnormal;
use Core\Db\Db as Db;
use Model\Admin\OptionModel as OptionModel;
use Model\Admin\ModelModel as ModelModel;
use Model\Admin\FieldModel as FieldModel;
use App\Func\Func as Func;

/**
 * PES程序主公共方法
 * @author LazyPHP
 * @version 1.0
 */
class All extends Controller {

    /**
     * 处理ajax提交过来的表单数组
     * @param array $key 提交表单名称
     * @param array $value 提交表单内容
     * @param str $filter 不执行过滤的提交内容|英文逗号分隔
     * @return array 返回处理过表单的数组
     */
    protected static function ajaxMethod($key, $value, $filter = '') {
        if (!is_array($key) || !is_array($value)) {
            self::error('参数不为数组');
        }
        $unfilter = explode(',', $filter);
        $total = count($key);
        for ($i = 0; $i < $total; $i++) {
            if (in_array($key[$i], $unfilter)) {
                $data[$key[$i]] = trim($value[$i]);
            } else {
                $data[$key[$i]] = htmlspecialchars(trim($value[$i]));
            }
        }

        return $data;
    }

    /**
     * 查找ajax提交过来的表单数组是否有提交内容
     * @param str $search 表单名称
     * @param array $subject 表单内容数组
     * @param str $msg 返回错误的信息
     */
    protected static function ajaxExistParam($search, array $subject, $msg = '缺少参数') {
        if (!array_key_exists($search, $subject)) {
            self::error($msg);
        } elseif (empty($subject[$search]) && !is_numeric($subject[$search])) {
            self::error($msg);
        }
    }

    /**
     * 初始化数据库
     * @param str $name 表名
     * @return obj 返回数据库对象
     */
    protected function db($name) {
        $db = Db::__init();
        $db->tableName($name);
        return $db;
    }

    /**
     * 是否存在模型
     * @param type $value 查找的值
     * @param type $type 查找的类型|默认为ID
     * @return boolean 提交参数为空时，返回二维数组。参数不为空则返回一维数组。没有结果则返回false;
     */
    protected function existModel($value = "", $type = "id") {
        return $this->commonExistAction('Model', '不存在此模型', $value, $type);
    }

    /**
     * 是否存在模型
     * @param type $value 查找的值
     * @param type $type 查找的类型|默认为ID
     * @return boolean 提交参数为空时，返回二维数组。参数不为空则返回一维数组。没有结果则返回false;
     */
    protected function existField($value = "", $type = "id") {
        return $this->commonExistAction('Field', '不存在此字段', $value, $type);
    }

    /**
     * 共用的字段查询方法
     * @param type $model 调用的模型名称
     * @param type $mes 提示信息
     * @param type $value 查找的值
     * @param type $type 查找的类型|默认为ID
     * @return boolean 提交参数为空时，返回二维数组。参数不为空则返回一维数组。没有结果则返回false;
     */
    private function commonExistAction($model, $mes, $value = "", $type = "id") {
        //虽然方法是不区分大小写的，但为了一致性
        $model = ucfirst($model);
        //此处必须以原路由格式调用
        $modelName = "Model\Admin\\{$model}Model";
        $actionName = "get{$model}";
        $result = $modelName::$actionName($value, $type);
        if ($result == false) {
            $this->error($mes);
        }
        return $result;
    }

    /**
     * 确定SQL语句执行是否成功
     * @param bool $result SQL的执行结果
     * @param string $messages 提示信息
     * @param Description string $url 跳转地址
     * @return bool
     */
    protected function determineSqlExecResult($result, $messages, $url = 'javascript:history.go(-1)') {
        if ($result === false) {
            $this->error($messages, $url);
        }
    }

    /**
     * 验证令牌
     */
    protected function chedkToken() {
        $token = $this->is_p('token', '令牌丢失');
        if ($token != $_SESSION['token']) {
            $this->error('令牌不正确');
        }
        unset($_SESSION['token']);
    }

    /**
     * 验证节点
     */
    protected function checkNode($groupId) {
        $db = $this->db('user_group');
        $userNode = $db->where("id = {$groupId}")->find();
        $competence = explode(',', $userNode['competence']);

        $db->tableName('node');
        //获取对应组的节点
        $groupNode = $db->where('name = "' . GROUP . '" and pid = 0')->find();
        if (empty($groupNode)) {
            return true;
        }
        //获取对应模型的权限
        $modelNode = $db->where("id in ({$groupNode['child']}) and verify = 1 and pid > 0 and name = '" . MODULE . "' ")->find();
        if (empty($modelNode)) {
            return true;
        }
        //获取对应方法的权限
        $actionNode = $db->where("pid = {$modelNode['id']} and verify = 1 and name = '" . ACTION . "' ")->find();
        if (empty($actionNode)) {
            return true;
        }
        if (!in_array($actionNode['id'], $competence)) {
            $this->error($actionNode['mes']);
        }
    }
    
    /**
     * 生成URL链接
     * @param type $controller 链接的控制器
     * @param array $param 参数
     * @return type 返回URL
     */
    protected function url($controller, array $param = array()){
        $func = new Func();
        return $func->url($controller, $param);
    }

}
